package map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Map的遍历
 * Map提供了三种遍历方式:
 * 遍历所有的key
 * 遍历每一组键值对
 * 遍历所有的value(这个操作不常用)
 */
public class MapDemo2 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("语文",99);
        map.put("数学",98);
        map.put("英语",97);
        map.put("物理",96);
        map.put("化学",99);
        System.out.println(map);

        /*
            遍历所有的key
            Set<K> keySet()
            将当前Map中所有的key以一个Set集合形式返回.遍历这个集合就等于遍历了所有的key
         */
        Set<String> keySet = map.keySet();
        for(String key : keySet){
            System.out.println("key:"+key);
        }

        /*
            遍历每一组键值对
            Set<Entry> entrySet()

            Map.Entry它的每一个实例用于表示Map中的一组键值对
            Entry有两个常用的方法:
            getKey(),getValue()分别用于获取其表示的键值对中的key和value
         */
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for(Map.Entry<String,Integer> e : entrySet){
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key+":"+value);
        }

        /*
            遍历所有的value
            Collection<V> values()
            将当前Map中所有的value值以集合形式返回,遍历该集合等于遍历所有的value
         */
        Collection<Integer> values = map.values();
        for(Integer value :values){
            System.out.println("value:"+value);
        }

        /*
            在JDK8之后集合和Map提供了一种新的遍历方式:基于lambda表达式遍历
            该方法为:forEach()

            集合中,forEach方法会将集合每个元素都拿到并调用Consumer的accept方法陆续传入
            注:Consumer消费者
         */
//        keySet.forEach(new Consumer<String>() {
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
        keySet.forEach(s->System.out.println(s));
        /*
            在lambda表达式中,如果参数与调用方法中传入的参数一致时,可以简写为方法引用:
            e->对象.方法(e);
            可以写为:
            对象::方法
         */
        keySet.forEach(System.out::println);

        /*
            Map也提供了forEach
         */
//        map.forEach(new BiConsumer<String, Integer>() {
//            public void accept(String k, Integer v) {
//                System.out.println(k+":"+v);
//            }
//        });
        map.forEach((k,v)->System.out.println(k+":"+v));

    }
}


